<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>策略模式</title>
</head>

<body>

</body>
<script>
  /*
    策略模式：
      + 一个问题匹配多个解决方案，不一定要用到那一个
      + 而且有可能随时还会继续增加多个方案
      例子：购物车结算
      => 我们有好多种折扣计算方式
      => 满 100 减 20
      => 满 200 减 25
      => 8 折
      => 7 折

    1、把我们的多种方案，以闭包的形式保存起来
      + 按照传递进来的折扣和价格计算最终结果返回
    2、留下添加和删除的折扣的接口
      + 函数也是一个对象
      + 可以把函数名当作一个对象，向里面添加一些成员
  */

  // 简单实现：接收两个参数：price type
  // 一旦加一种折扣，就很麻烦
  // function calcPrice(price, type) {
  //   if (type === '100_10') {
  //     price -= 30
  //   } else if (type === '200_25') {
  //     price -= 25
  //   } else if (type === '80%') {
  //     price *= 0.8
  //   } else {
  //     console.log('没有这种折扣')
  //   }
  //   return price
  // }





  // 1、暂时以闭包的形式把折扣方案保存下来
  // const calcPrice = (function () {

  //   const sale = {
  //     '100_10': price => price -= 10,
  //     '200_25': price => price -= 25,
  //     '80%': price => price *= 0.8,
  //   }

  //   // 被 return 出去的函数，才是 calcPrice 本体
  //   return function calcPrice(price, type) {
  //     // 判断对象里面有没有这个折扣类型
  //     // 如果有，那么就执行
  //     // 如果没有，那么就告诉他没有这个折扣类型
  //     if (!sale[type]) return '没有这个折扣';

  //     // 找到 sale 里面指定的那个函数执行计算出结果，返回给外边
  //     return sale[type](price)
  //   }
  // })()


  // 2、留下添加和删除折扣的接口
  const calcPrice = (function () {
    const sale = {
      '100_10': price => price -= 10,
      '200_25': price => price -= 25,
      '80%': price => price *= 0.8,
    }

    function calcPrice(price, type) {
      if (!sale[type]) return '没有这个折扣';
      return sale[type](price)
    }

    // 把函数当作一个对象，向里面添加一些成员
    calcPrice.add = function (type, fn) {
      // 专门用来添加折扣
      // 判断这个折扣是不是存在
      if (sale[type]) return '该折扣已经存在';

      // 代码来到这里，表示折扣不存在
      sale[type] = fn;
      return '添加成功'
    }

    // 删除一个折扣
    calcPrice.del = function (type) {
      // 把对应的折扣删除掉
      delete sale[type]
    }

    return calcPrice
  })()

  // 使用的时候
  // 添加一个折扣
  calcPrice.add('70%', function (price) { return price *= 0.7 })
  const res = calcPrice(320, '70%')
  console.dir(calcPrice)
  console.dir(res)

  // 删除一个折扣
  calcPrice.del('100_10');
  const res2 = calcPrice(320, '100_10');
  console.log(res2)

  // const res = calcPrice(320, '200_25');
  // const res = calcPrice(320, '70%');
  // console.log(res)






</script>

</html>